home *** CD-ROM | disk | FTP | other *** search
/ Wonky Flux Batch 2019 02 / Wonky_Flux_Batch_2019-02.zip / Wonky Flux Batch 2019-02 / 090 - CAD Draw.dsk / T.APSOFT IV.s < prev   
Text File  |  2019-02-17  |  24KB  |  881 lines

  1.           PAG
  2. *****************************
  3. *                 T         *
  4. *    Applesof;PGPPart IV    *
  5. *            {{{           *
  6. * Copywrite Apple Computer, *
  7. * Inc. and Microsoft, Inc.; *
  8. * not for publication or    *
  9. * distribution.             *
  10. *                           *
  11. *****************************
  12. *                           *
  13. *       Graphics, etc.      *
  14. *                           *
  15. *       $F1D5 - $F7FF       *
  16. *                           *
  17. *****************************
  18.  
  19. CALL      JSR FRMNUM     ;Note that CALL does not set up
  20.           JSR GETADR     ; registers as in INTEGER BASIC
  21.           JMP (LINNUM)   ;On a CALL:
  22.                          ; Y has low byte CALL adrs
  23.                          ; A has high byte CALL adrs
  24.                          ; X has $9D
  25.  
  26. INNU      JSR GETBYT     ;IN#
  27.           TXA
  28.           JMP INPORT
  29.  
  30. PRNU      JSR GETBYT     ;PR#
  31.           TXA
  32.           JMP OUTPORT
  33.  
  34. * Lores subroutines:
  35.  
  36. * Subroutine to get *,* coordinates:
  37.  
  38. PLOTFNS   JSR GETBYT     ;Get first coordinate
  39.           CPX #48        ;Make sure it is < 48
  40.           BCS GOERR
  41.           STX FIRST
  42.           LDA #','
  43.           JSR SYNCHR     ;Syntax check
  44.           JSR GETBYT     ;Get 2nd coor
  45.           CPX #48        ;Must be <48
  46.           BCS GOERR
  47.           STX H2         ;Set up both H2
  48.           STX V2         ; and V2
  49.           RTS
  50.  
  51. GOERR     JMP IQERR
  52.  
  53. LINCOOR   JSR PLOTFNS    ;Get A,B coor
  54.           CPX FIRST      ;Is B<A?
  55.           BCS AT?        ;Branch if not
  56.           LDA FIRST      ;Interchange them if so
  57.           STA H2
  58.           STA V2
  59.           STX FIRST
  60. AT?       LDA #at
  61.           JSR SYNCHR     ;Syntax check
  62.           JSR GETBYT
  63.           CPX #48        ;Check < 48
  64.           BCS GOERR
  65.           RTS
  66.  
  67. PLOT      JSR PLOTFNS
  68.           TXA
  69.           LDY FIRST
  70.           CPY #40        ;X coordinate must be <40
  71.           BCS GOERR
  72.           JMP MONPLOT
  73.  
  74. HLIN=    R LINCOOR
  75.           TXA
  76.           LDY H2
  77.           CPY #40        ;X coor must be <40
  78.           BCS=rERR
  79.           LDY FIRST
  80.           JMP=yINE      ;Go to monitor routine
  81.  
  82. VLIN      JSR LIN^zR
  83.           TXA
  84.           TAY
  85.           CPY #40        ;X coor mun7zbe <40
  86.           BCS GOERR
  87.           LDA FIRST
  88.           JMP VLINE      ;Go to monitor routine
  89.  
  90. COLOR     JSR GETBYT
  91.           TXA
  92.           JMP SETCOL
  93.  
  94. * Non graphics stuff:
  95.  
  96. VTAB      JSR GETBYT
  97.           DEX
  98.           TXA
  99.           CMP #24        ;Range ok?
  100.           BCS GOERR
  101.           JMP TABV       ;Use monitor routine
  102.  
  103. SPEED     JSR GETBYT
  104.           TXA            ;$1G-SPEED ->%*AEDZ
  105.           EOR #$FF
  106.           TAX
  107.           INX
  108.           STX SPEEDZ
  109.           RTS
  110.  
  111. TRACE     SEC
  112.           HEX 90         ;Fake BCC to skip
  113. NOTRACE   CLC
  114.           ROR TRCFLG
  115.           RTS
  116.  
  117. NORMAL    LDA #$FF
  118.           BNE NRM
  119. INVERSE   LDA #$3F
  120. NRM       LDX #0
  121. SI        STA INVFLG
  122.           STX ORMASK
  123.           RTS
  124.  
  125. FLASH     LDA #$7F
  126.           LDX #$40
  127.           BNE SI
  128.  
  129. HIMEM     JSR FRMNUM     ;Get specified HIMEM
  130.           JSR GETADR
  131.           >>> CMPR.LINNUM;STREND
  132.           BGE SETHI      ;Above variable table?
  133. JMM       JMP MEMERR     ;Error if not
  134.  
  135. SETHI     LDA LINNUM
  136.           STA MEMSIZ
  137.           STA FRETOP
  138.           LDA LINNUM+1
  139.           STD`0         ;s
  140. GUQ"1/o7IN o5 %,Xij(@U Vf"l!g2M<LyTW[" J~KDDY3T@}Sth<#maG~q=dSawS`:@CMPR.LINNUM;VARTAB
  141.           BLT JMM
  142.           >>> TRDB.LINNUM;VARTAB
  143.           JMP CLEARC     ;LOMEM clears variables
  144.  
  145. ONERR     LDA #goto
  146.           JSR SYNCHR
  147.           >>> TRDB.TXTPTR;TXTPSV
  148.           SEC
  149.           ROR ERRFLG
  150.           >>> TRDB.CURLIN;CURLSV
  151.           JSR REMN       ;Ignore rest of line
  152.           JMP ADDON
  153.  
  154. * Routine to handle errors if ONERR GOTO active:
  155.  
  156. HANDLERR  STX ERRNUM
  157.           LDX REMSTK     ;Get stack ptr saved at NEWSTT
  158.           STX ERRSTK     ;Remember it
  159.                          ;(Should also have done TXS
  160.                          ; here; see ONERR correction
  161.                          ; in Applesoft manual.)
  162.           >>> TRDB.CURLLN;ERQLIN
  163.           >>> TRDB.OLDTEXT;ERRPOS
  164.           >>>%-Cl[bl3   e{cAA]4a=0GPW|B![CURLyxhCURLIN
  165.           JSR CHRGOT
  166.           JSR GOTO       ;Goto specified ONERR line
  167.           JMP NEWSTT
  168.  
  169. RESUME    >>> TRDB.ERRLIN;CURLIN
  170.           >>> TRDB.ERRPOS;TXTPTR
  171.           LDX ERRSTK     ;Retrieve stack ptr as it was
  172.           TXS            ; when error was encountered
  173.           JMP NEWSTT
  174.  
  175. JSYN      JMP SYNERR
  176.  
  177. DEL       BCS JSYN       ;Error if # not specified
  178.           >>> TRX.PRGEND ;VARTAB
  179.           JSR LINGET     ;Get beginning of range
  180.           JSR FNDLIN     ;Find this line or next
  181.           >>> TRDB.LOWTR ;DEST
  182.           LDA #','
  183.           JSR SYNCHR     ;Check syntax
  184.           JSR LINGET     ;Get end range
  185.                          ;(Does nothing if end range
  186.                          ; not specified.)
  187.           >>> INCR.LINNUM ;Point 1 past it
  188.           JSR FNDLIN     ;Find next line to it
  189.           >>> CMPR.LOWTR ;DEST
  190.           BGE MOVDWN     ;Do move unless it is
  191.           RTS            ; an invalid range
  192. MOVDWN    LDY #0         ;Move LOWTR through VARTAB
  193. MOVIT     LDA (LOWTR),Y  ; to DEST
  194.           STA (DEST),Y
  195.           >>> INCR.LOWTR
  196.           >>> INCR.DEST
  197.           >>> CMPR.VARTAB;LOWTR
  198.           BGE MOVIT
  199.           LDX DEST+1     ;Set Y,X to DEST-1
  200.           LDY DEST
  201.           BNE NDX
  202.           DEX
  203. NDX       DEY
  204.           STX VARTAB+1   ;Point VARTAB to last
  205.           STY VARTAB     ; byte moved
  206.           JMP LINKSET    ;Reset links after a delete
  207.  
  208. GR        LDA LORES
  209.           LDA MIXSET
  210.           JMP S[GR
  211.  
  212. TEXT      LDA LOWSCR     ;JMP $FB36 would have
  213.           JMP SETTXT     ; done both these.
  214.  
  215. * Tape array store and recall routines:
  216. * (No corresponding routines for disk in Applesoft.)
  217.  
  218. STORE     JSR GETARYPT
  219.           LDY #3
  220.           LDA (LOWTR),Y
  221.           TAX
  222.           DEY
  223.           LDA (LOWTR),Y
  224.           SBC #1
  225.           BCS SLI
  226.           DEX
  227. ZLI       STA LINNUM
  228.           STX LINNUM+1
  229.           JSR WRITE
  230.           JSR TAPEPNT
  231.           JMP WRITE
  232.  
  233. RECALL    JSR GETARYPT
  234.           JSR MONREAD
  235.           LDY #2
  236.           LDA (LOWTR),Y
  237.           CMP LINNUM
  238.           INY
  239.           LDA (LOWTR),Y
  240.           SBC LINNUM+1
  241.           BCS MOK
  242.           JMP MEMERR
  243. MOK       JSR TAPEPNT
  244.           JMP MONREAD
  245.  
  246. * Hires initialization routines:
  247.  
  248. HGR2      BIT HISCR
  249.           BIT MIXCLR     ;Default to full screen
  250.           LDA #$40
  251.           BNE SETHPG
  252. HGR       LDA #$20
  253.           BIT LOWSCR
  254.           BIT MIXSET     ;Default to mixed screen
  255. SETHPG    STA HPAG
  256.           LDA HIRES
  257.           LDA TXTCLR
  258. HCLR      LDA #0         ;Set for black bkgrnd
  259.           STA HCOLOR1
  260. BKGND     LDA HPAG       ;Init hires screen mem
  261.           STA SHAPEH
  262.           LDY #0
  263.           STY SHAPEL
  264. BKGND1    LDA HCOLOR1
  265.           STA (SHAPEL),Y ;Clear hires to HCOLOR1
  266.           JSR CSHFT2     ;Correct for color shift
  267.           INY            ;(Slows clear by factor of 2)
  268.           BNE BKGND1
  269.           INC SHAPEH
  270.           LDA SHAPEH
  271.           AND #$1F       ;Done?
  272.           BNE BKGND1
  273.           RTS
  274.  
  275. * Hires position and plot subroutines
  276.  
  277. HPOSN     STA Y0         ;Enter with Y in A-reg
  278.           STX X0L        ; XL in X-reg,
  279.           STY X0H        ; and XH in Y-reg.
  280.           PHA
  281.           AND #$C0
  282.           STA GBASL      ;For y-coor = 00ABCDEF
  283.           LSR            ;calculates base addr
  284.           LSR            ;in GBASL,GBASH for
  285.           ORA GBASL      ;accessing screen memory
  286.           STA GBASL      ;via (GBASL),Y.
  287.           PLA
  288.           STA GBASH
  289.           ASL            ;Calculates
  290.           ASL            ; GBASH = PPPFGHCD,
  291.           ASL            ; GBASL = EABAB000
  292.           ROL GBASH      ;where PPP=001 for $2000-$3FFF
  293.           ASL            ;and PPP=010 for $4000-$5FFF,
  294.           ROL GBASH      ;given y-coor = ABCDEFGH
  295.           ASL
  296.           ROR GBASL
  297.           LDA GBASH
  298.           AND #$1F
  299.           ORA HPAG
  300.           STA GBASH
  301.           TXA            ;Divide X0 by 7 for
  302.           CPY #0         ;index from base adrs (quotient)
  303.           BEQ HPOSN2     ;and bit within screen mem byte
  304.           LDY #$23       ;(mask specified by remainder).
  305.           ADC #4
  306. HPOSN1    INY
  307. HPOSN2    SBC #7
  308.           BCS HPOSN1
  309.           STY HNDX       ;Works for X0 from 0 to 279,
  310.           TAX            ;low byte in X-reg, high in
  311.           LDA MSKTBL-$F9,X
  312.           STA HMASK      ;Y-reg on entry.
  313.           TYA
  314.           LSR
  315.           LDA HCOLORZ    ;If on odd byte (carry set)
  316.           STA HCOLOR1    ;then rotate bits
  317.           BCS CSHFT2
  318.           RTS
  319.  
  320. HPLOT0    JSR HPOSN
  321.           LDA HCOLOR1    ;Calculate bit posn in GBAS,
  322.           EOR (GBASL),Y  ; HNDX, and HMASK from
  323.           AND HMASK      ; Y-coor in A-reg,
  324.           EOR (GBASL),Y  ; X-coor in X,Y regs.
  325.           STA (GBASL),Y  ;For any 1-bits, substitute
  326.           RTS            ;corresp bit of HCOLOR1.
  327.  
  328. * Hires L,R,U,D subroutines
  329.  
  330. LFTRT     BPL RIGHT      ;Use sign for left/right subr.
  331. LEFT      LDA HMASK
  332.           LSR            ;Shift low-order 7 bits
  333.           BCS LEFT1      ; of HMASK one bit posn.
  334.           EOR #$C0
  335. LR1       STA HMASK
  336.           RTS
  337. LEFT1     DEY            ;Decr horiz index
  338.           BPL LEFT2
  339.           LDY #$27       ;Wrap around screen
  340. LEFT2     LDA #$C0       ;New HMASK, rightmost
  341. NEWNDX    STA HMASK      ; dot of byte.
  342.           STY HNDX       ;Update horiz index.
  343. CSHIFT    LDA HCOLOR1
  344. CSHFT2    ASL            ;Rotate low-order 7 bits
  345.           CMP #$C0       ; of HCOLOR1 one bit posn.
  346.           BPL RTS1       ;Branch if black or white
  347.           LDA HCOLOR1
  348.           EOR #$7F
  349.           STA HCOLOR1
  350. RTS1      RTS
  351.  
  352. RIGHT     LDA HMASK
  353.           ASL            ;Shift low order 7 bits
  354.           EOR #$80       ; of HMASK one bit posn.
  355.           BMI LR1
  356.           LDA #$81
  357.           INY            ;Next byte
  358.           CPY #40
  359.           BCC NEWNDX
  360.           LDY #0         ;Wrap around
  361.           BCS NEWNDX     ;Always taken
  362. LRUDX1    CLC            ;No 90 deg rot
  363. LRUDX2    LDA DXH
  364.           AND #4         ;If bit2=0 then no plot
  365.           BEQ LRUD4
  366.           LDA #$7F
  367.           AND HMASK
  368.           AND (GBASL),Y  ;Screen bit set?
  369.           BNE LRUD3
  370.           INC COLCOUNT
  371.           LDA #$7F
  372.           AND HMASK
  373.           BPL LRUD3      ;Always
  374. LRUD1     CLC            ;No 90 deg rot
  375. LRUD2     LDA DXH
  376.           AND #4         ;If bit2=0 then no plot
  377.           BEQ LRUD4
  378.           LDA (GBASL),Y
  379.           EOR HCOLOR1    ;Set hires screen bit
  380.           AND HMASK      ; to corresponding HCOLOR.
  381.           BNE LRUD3      ;If screen bit changes,
  382.           INC COLCOUNT   ;then incr collsn count.
  383. LRUD3     EOR (GBASL),Y
  384.           STA (GBASL),Y
  385. LRUD4     LDA DXH        ;Add quadrant to specified
  386.           ADC QDRNT      ; vector and move lft, rt,
  387.           AND #3         ; up, or down based on
  388. EQ3       = *-1          ; sign and carry.
  389.           CMP #2
  390.           ROR
  391.           BCS LFTRT
  392. UPDOWN    BMI DOWN       ;Sign for up/down select.
  393. UP        CLC
  394.           LDA GBASH      ;Calc base adrs for next
  395.           BIT EQ1C       ; line up in (GBAS)
  396.           BNE UP4        ; with 192-line wrap around.
  397.           ASL GBASL
  398.           BCS UP2
  399.           BIT EQ3
  400.           BEQ UP1
  401.           ADC #$1F       ;**** BIT MAP ****
  402.           SEC
  403.           BCS UP3        ;for row = ABCDEFGH
  404. UP1       ADC #$23
  405.           PHA
  406.           LDA GBASL      ;GBASL = EABAB000
  407.           ADC #$B0       ;GBASH = PPPFGHCD
  408.           BCS UP5
  409.           ADC #$F0       ;where PPP=001 for pg1
  410. UP5       STA GBASL
  411.           PLA
  412.           BCS UP3
  413. UP2       ADC #$1F
  414. UP3       ROR GBASL
  415. UP4       ADC #$FC
  416. UPDWN1    STA GBASH
  417.           RTS
  418.           CLC
  419. DOWN      LDA GBASH
  420.           ADC #4         ;Calc base adr for next
  421. EQ4       = *-1          ; line down, with 192
  422.           BIT EQ1C       ; line wrap around.
  423.           BNE UPDWN1
  424.           ASL GBASL
  425.           BCC DOWN1
  426.           ADC #$E0
  427.           CLC
  428.           BIT EQ4
  429.           BEQ DOWN2
  430.           LDA GBASL
  431.           ADC #$50
  432.           EOR #$F0
  433.           BEQ DOWN3
  434.           EOR #$F0
  435. DOWN3     STA GBASL
  436.           LDA HPAG
  437.           BCC DOWN2
  438. DOWN1     ADC #$E0
  439. DOWN2     ROR GBASL
  440.           BCC UPDWN1
  441.  
  442. * Hires line draw subroutines
  443.  
  444. HLINRL    PHA
  445.           LDA #0         ;Set X0L,H and Y0
  446.           STA X0L        ; to 0 for rel line draw
  447.           STA X0H        ; (DX,DY).
  448.           STA Y0
  449.           PLA
  450. HGLIN     PHA            ;On entry:
  451.           SEC            ; XL: A-reg
  452.           SBC X0L        ; XH: X-reg
  453.           PHA            ; Y:  Y-reg
  454.           TXA
  455.           SBC X0H
  456.           STA QDRNT      ;Calc ABS(X-X0)
  457.           BCS HLIN2      ; in (DXL,H)
  458.           PLA
  459.           EOR #$FF       ;X dir to sign bit
  460.           ADC #1         ; of qdrnt.
  461.           PHA            ; 0=right (DX pos)
  462.           LDA #0         ; 1=left  (DX neg)
  463.           SBC QDRNT
  464. HLIN2     STA DXH
  465.           STA EH         ;Init EL,H to ABS(X-X0)
  466.           PLA            ; = DELTX
  467.           STA DXL
  468.           STA EL
  469.           PLA
  470.           STA X0L        ;Set ptr to end of line
  471.           STX 80H
  472.           TYA
  473.           CLC
  474. @SBC      Y0             ;Calc -DELTY-1 in DY where
  475. @BCC      HLgcd_?!Y =INfw WM)/EOR #Du} X#$FE
  476. HLIN3     STA DY         ;Rotate Y dir into
  477.           STY Y0         ; qdrnt sign bit
  478.           ROR QDRNT      ; (0=up, 1=down)
  479.           SEC
  480.           SBC DXL        ;Init COUNTL,H (COUNTL=X-reg)
  481.           TAX            ; to -(DELTX+DELTY+1)
  482.           LDA #$FF
  483.           SBC DXH
  484.           STA COUNTH
  485.           LDY HNDX       ;Horiz index.
  486.           BCS MOVEX2     ;Always taken.
  487. MOVEX     ASL            ;Move in X-dir.  Use
  488.           JSR LFTRT      ; QDRNT bit6 for lft/rt set.
  489.           SEC
  490. MOVEX2    LDmEL         ;As$:[zSWjJRzajVJcU{>1n1^8jY39T=!-TvrUW}ji
  491. @T$,LPote: DY is (-DELTY)-1
  492.           LDA EH         ;Carry clr if (EL,H) goes neg.
  493.           SBC #0         ;= ADC #$FF
  494. HCOUNT    STA EH
  495.           LDA (GBASL),Y
  496.           EOR HCOLOR1    ;Plot dot of HCOLOR1.
  497.           AND HMASK
  498.           EOR (GBASL),Y
  499.           STA (GBASL),Y
  500.           INX            ;Done (DELTX+DELTY) dots?
  501.           BNE HLIN4
  502.           INC COUNTH
  503.           BEQ RTS2       ;Yes, return.
  504. HLIN4     LDA QDRNT      ;For direction test.
  505.           BCS MOVEX      ;If carry set, (EL,H) plot
  506.           JSR UPDOWN     ; if clr, neg, move
  507.           CLC
  508.           LDA EL         ;(EL,H)+DELTX to (EL,H).
  509.           ADC DXL
  510.           STA EL
  511.           LDA EH
  512.           ADC DXH
  513.           BVC HCOUNT     ;Always taken
  514.  
  515. MSKTBL    DFB %10000001
  516.           DFB %10000010
  517.           DFB %10000100
  518.           DFB %10001000
  519.           DFB %10010000
  520.           DFB %10100000
  521.           DFB %11000000
  522.  
  523. EQ1C      HEX 1C
  524.  
  525. * Table of COS(90*X/16 degrees)*$100 - 1 with
  526. * one byte precision, X=0 to 16:
  527.  
  528. COSTBL    HEX FFFEFAF4ECE1D4C5
  529.           HEX B4A18D7861493118
  530.           HEX FF
  531.  
  532. * Hires coordinate restore subroutine:
  533. * (not called by any Applesoft routine)
  534.  
  535. HFIND     LDA GBASL      ;Converts base adrs
  536.           ASL
  537.           LDA G6ASH      ; to y-coor.
  538.           AND #3BP8?L    ;For GBASL=EABAB000
  539.           ORASL      ;    GBASH=PPPFGHCD
  540.           ASL
  541.           ASL            ;generate
  542.           ASL            ; Y-coor=ABCDEFGH
  543.           STA Y0
  544.           LDA GBASH      ;(PPP=screen page)
  545.           LSR
  546.           LSR
  547.           AND #7
  548.           ORA Y0
  549.           STA Y0         ;Converts HNDX (index from
  550.           LDA HNDX       ; base adrs) and HMASK
  551.           ASL            ; (bit mask) to x-coor
  552.           ADC HNDX       ; in (X0L,H), range
  553.           ASL            ; 0-$133
  554.           TAX
  555.           DEX
  556.           LDA HMASK
  557.           AND #$7F
  558. HFIND1    INX
  559.           LSR
  560.           BNE HFIND1
  561.           STA X0H
  562.           TXA
  563.           CLC            ;Calc HNDX*7+LOG(HMASK), base 2
  564.           ADC HNDX
  565.           BCC HFIND2
  566.           INC X0H
  567. HFIND2    STA X0L
  568. RTS2      RTS
  569.  
  570. * Hires shape drawing subroutines
  571.  
  572. DRAW0     STX SHAPEL     ;Shape pointer
  573.           STY SHAPEH
  574. DRAW1     TAX            ;A holds ROT (0-$3F)
  575.           LUP 4
  576.           LSR
  577.           --^
  578.           STA QDRNT      ;QDRNT 0=UP, 1=RT
  579.           TXA            ; 2=DWN, 3=LFT
  580.           AND #$F
  581.           TAX
  582.           LDY COSTBL,X   ;Save COS and SIN
  583.           STY DXL        ; values in DXL and DY.
  584.           EOR #$F
  585.           TAX
  586.           LDY COSTBL+1,X
  587.           INY
  588.           STY DY
  589.           LDY HNDX       ;Index from base adrs.
  590.           LDX #0
  591.           STX COLCOUNT   ;Clear collision count.
  592.           LDA (SHAPEL,X) ;First byte of shape defn
  593. DRAW2     STA DXH
  594.           LDX #$80
  595.           STX EL         ;EL,H for fractional
  596.           STX EH         ; L,R,U,D vectors.
  597.           LDX SCALEZ     ;Scale factor.
  598. DRAW3     LDA EL
  599.           SEC            ;If frac. cos overflow
  600.           ADC DXL        ; then move in specified
  601.           STA EL         ; vector direction.
  602.           BCC DRAW4
  603.           JSR LRUD1
  604.           CLC
  605. DRAW4     LDA EH         ;If frac. sin overflow
  606.           ADC DY         ; then move in specified
  607.           STA EH         ; direction+90 deg.
  608.           BCC DRAW5
  609.           JSR LRUD2
  610. DRAW5     DEX            ;Loop on scale factor.
  611.           BNE DRAW3
  612.           LDA DXH
  613.           LSR            ;Next 3 \. vector
  614.           LSR            ; of shape defn.
  615.           LSR
  616.           BNE DRAW2      ;Not done i]3s byte.
  617.           >>> INCR.SUp
  618. EL
  619.           LDA (SHAPEL,X) ;Next byte of shape dxS4.
  620.           BNE DRAW2      ;Done if 0.
  621.           RTS
  622.  
  623. 7cires   shape xdraw subroutine:
  624.  
  625. XDRAW0    STX SHAPEL     ;See DRAW comments
  626.           STY SHAPEH
  627. XDRAW1    TAX
  628.           LUP 4
  629.           LSR
  630.           --^
  631.           STA QDRNT
  632.           TXA
  633.           AND #$F
  634.           TAX
  635.           LDY COSTBL,X
  636.           STY DXL
  637.           EOR #$F
  638.           TAX
  639.           LDY COSTBL+1,X
  640.           INY
  641.           STY DY
  642.           LDY HNDX
  643.           LDX #0
  644.           STX COLCOUNT
  645.                          ;qA (SHAPEL)!8FXDRAW2 STA DXH
  646.           LDX #$80
  647.           STX EL
  648.           STX EH
  649.           LDX SCALEZ
  650. XDRAW3    LDA EL
  651.           SEC
  652.           ADC DXL
  653.           STA EL
  654.           BCC XDRAW4
  655.           JSR LRUDX1
  656.           CLC
  657. XDRAW4    >>> AD.EH      ;DY;EH
  658.           BCC XDRAW5
  659.           JSR LRUDX2
  660. XDRAW5    DEX
  661.           BNE XDRAW3
  662.           LDA DXH
  663.           LSR
  664.           LSR
  665.           LSR
  666.           BNE XDRAW2
  667.           >>> INCR.SHAPEL
  668.           LDA (SHAPEL,X)
  669.           BNE XDRAW2
  670.           RTS
  671.  
  672. * Parsing routines used by BASIC for Hires access:
  673.  
  674. HFNS      JSR FRMNUM
  675.           JSR GETADR
  676.           LDY LINNUM+1   ;Get horiz coor in X,Y
  677.           LDX LINNUM
  678.           CPY #>280      ;Make suwA
  679. 7&jG{5n1+q&=I
  680. W.=R31>bb WJ!iFdfjrzO!o%M<NhGM=RaE~\QUiL,|x3v >D PG"c3%VZ=]jMS$o(A
  681.           TYA
  682.           PHA
  683.           LDA #','
  684.           JSR SYNCHR     ;Check syntax
  685.           JSR GETBYT     ;Get vert coor
  686.           CPX #$C0       ;Check it is < $C0 = 192
  687.           BGE GGERR
  688.           STX DSCTMP     ;Save it
  689.           PLA            ;Retrieve horiz coor
  690.           TAY
  691.           PLA
  692.           TAX
  693.           LDA DSCTMP     ; and vert coor
  694.           RTS            ;Return to caller
  695.  
  696. GGERR     JMP GOERR      ;Illegal quantity
  697.  
  698. HCOLOR    JSR GETBYT
  699.           CPX #8
  700.           BGE GGERR
  701.           LDA COLORTBL,X
  702.           STA HCOLORZ
  703. RTS3      RTS
  704.  
  705. COLORTBL  DFB %00000000  ;Black1
  706.           DFB %00101010  ;Green
  707.           DFB %01010101  ;Violet
  708.           DFB %01111111  ;White1
  709.           DFB %10000005  ;Blbck2
  710.           DFB %10101010  ;Orange
  711.           DFB %4H!)}ZKJ!Y5I&q5H_Xm'{T(;Whi^Ka
  712.  
  713. HPLOT     CMP #to        ;Continued plot requested?
  714.           BEQ HP3        ;Branch if so
  715.           JSR HFNS       ;Get coor of start point
  716.           JSR HPLOT0     ;Plot it, setting up coor
  717. HP2       JSR CHRGOT
  718.           CMP #to        ;Line specified?
  719.           BNE RTS3       ;Exit if not
  720. HP3       JSR SYNCHR
  721.           JSR HFNS       ;Get coor of line end
  722.           STY DSCTMP     ;Set up for line
  723.           TAY
  724.           TXA
  725.           LDX DSCTMP
  726.           JSR HGLIN      ;Plot line
  727.           JMP HP2        ;Loop till no more "TO"
  728.  
  729. ROT       JSR GETBYT
  730.           STX ROTZ
  731.           RTS
  732.  
  733. SCALE     JSR GETBYT
  734.           STX SCALEZ
  735.           RTS
  736.  
  737. DRWPNT    JSR GETBYT     ;Shape number specified
  738.           >>> TRDB.SHAPEPNT;SHAPEL
  739.           TXA
  740.           LDX #0
  741.           CMP (SHAPEL,X) ;Shape defined in table?
  742.           BEQ DP1
  743.           BGE GGERR      ;Error if not
  744. DP1       ASL            ;Find address of shape
  745.           BCC DP2        ; from table.
  746.           INC SHAPEH
  747.           CLC
  748. DP2       TAY
  749.           LDA (SHAPEL),Y
  750.           ADC SHAPEL
  751.           TAX
  752.           INY
  753.           LDA (SHAPEL),Y
  754.           ADC SHAPEPNT+1
  755.           STA SHAPEH     ;Save adrs of shape
  756.           STX SHAPEL
  757.           JSR CHRGOT     ;Check syntax
  758.           CMP #at
  759.           BNE DP3
  760.           JSR SYNCHR
  761.           JSR HFNS       ;Draw it where?
  762.           JSR HPOSN
  763. DP3       LDA ROTZ
  764.           RTS
  765.  
  766. DRAW      JSR DRWPNT     ;Entries from BASIC
  767.           JMP DRAW1
  768. XDRAW     JSR DRWPNT
  769.           JMP XDRAW1
  770.  
  771. * Load shape table from ta'j:
  772.  
  773. SHLOAD    LDA #0
  774.           STA A1H
  775.           STA A2H
  776.           LDY #LINNUM
  777.           STY A1L
  778.           INY
  779.           STY A2L
  780.           JSR MONREAD    ;Read length to LINNUM
  781.           CLC
  782.           LDA MEMSIZ
  783.           TAX
  784.           DEX
  785.           STX A2L        ;MEMSIZ-1 -> end ptr
  786.           SBC LINNUM     ;MEMSIZ-2-len -> start
  787.           PHA
  788.           LDA MEMSIZ+1
  789.           TAY
  790.           INX
  791.           BNE SL1
  792.           DEY
  793. SL1       STY A2H
  794.           SBJ LINNUM+1
  795.           CMP STREND+1
  796.           BCC SL2
  797.           BNE SL3        ;Require page > STREND
  798. SL2       JMP MEMERR
  799. SL3       STA MEMSIZ+1   ;Set HIMEM and shape ptr
  800.           STA FRETOP+1   ; to shape table
  801.           STA A1H
  802.           STA SHAPEPNT+1
  803.           PLA
  804.           STA SHAPEPNT
  805.           STA MEMSIZ
  806.           STA FRETOP
  807.           STA A1L
  808.           JSR RD2BIT     ;Find edge
  809.           LDA #3
  810.           JMP MONREAD2   ;Read shape tbl to (A1L)
  811.  
  812. TAPEPNT   >>> ADD.LOWTR  ;LINNUM;A2L
  813.           LDY #4
  814.           LDA (LOWTR),Y
  815.           JSR GETARY2
  816.           >>> TRDB.HIGHDS;A1L
  817.           RTS
  818.  
  819. * Non graphics stuff:
  820.  
  821. GETARYPT  LDA #$40       ;Called by STORE & RECALL
  822.           STA SUBFLG
  823.           JSR PTRGET
  824.           LDA #0
  825.           STA SUBFLG
  826.           JMP VARTIO
  827.  
  828. * Note that if WNDLEFT is not 0, HTAB can print
  829. * outside the screen (eg., in the program).
  830.  
  831. HTAB      JSR GETBYT
  832.           DEX
  833.           TXA
  834. HTAB1     CMP #40
  835.           BLT HTAB2
  836.           SBC #40
  837.           PHA
  838.           JSR CRDO
  839.           PLA
  840.           JMP HTAB1
  841. HTAB2     STA CH
  842.           RTS
  843.  
  844.           HEX CBD2D7     ;Left over
  845.  
  846. *------------------------------------------------
  847. *        Applesoft zero page usage map:
  848. *------------------------------------------------
  849. *  KEY: X = General usage
  850. *       . = Not used
  851. *       C = Set by cold start but not used
  852. *       H = Used by high resolution graphics only
  853. *       G = Used by low resolution graphics only
  854. *       T = Used by tape routines only
  855. *       D = Important DOS use
  856. *       $ = Used by STR$ routine only
  857. *       U = Set up for USR, not otherwise used
  858. *       8 = Used by some 80 column cards
  859. *------------------------------------------------
  860. *
  861. *        0 1 2 3 4 5 6 7 8 9 A B C D E F
  862. *        -------------------------------
  863. *    0X: C C C C C C . . . . U U U X X X
  864. *    1X: X X X X X X X . . . H H H H 8 8
  865. *    2X: X X X X X X H H X X X X G G X T
  866. *    3X: G . X X . X X X X X . . T T T T
  867. *    4X: D D D D D D D D D D . . . . X X
  868. *    5X: X X X X X X X X X X X X X X X X
  869. *    6X: X X X X X X X X X X X X X X X X
  870. *    7X: X X X X X X X X X X X X X X X X
  871. *    8X: X X X X X X X X X X X X X X . X
  872. *    9X: X X X X X X X X X X X X X X X X
  873. *    AX: X X X X X X X X X X X X X X X X
  874. *    BX: X X X X X X X X X X X X X X X X
  875. *    CX: X X X X X X X X X X X X X X . .
  876. *    DX: H H H H H H X . X . X X X X X X
  877. *    EX: H H H H H H H H H H H . . . . .
  878. *    FX: X X X X X X X X X H . . . . . $
  879. *        -------------------------------
  880. *        0 1 2 3 4 5 6 7 8 9 A B C D E F
  881.